package com.gdth.widget.scrollview;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v4.util.LruCache;

/**
 * singleton ImageLoader
 * @author arvin
 *
 */
public class ImageLoader {
	/** 
     * 图片缓存技术的核心类，用于缓存所有下载好的图片，在程序内存达到设定值时会将最少最近使用的图片移除掉。 
     */  
    private static LruCache<String, Bitmap> mMemoryCache;  
  
    /** 
     * ImageLoader 
     */  
    private static ImageLoader mImageLoader;  
  
    /** 
     * singleton pattern 
     * @return ImageLoader 
     */  
    public static ImageLoader getInstance() {  
        if (mImageLoader == null) {  
            mImageLoader = new ImageLoader();  
        }  
        return mImageLoader;  
    }  
  
    private ImageLoader() {  
    	int cacheSize = getCacheSize();
    	
        mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {  
            @Override  
            protected int sizeOf(String key, Bitmap bitmap) {  
                return bitmap.getByteCount();  
            }  
        };  
    }
    
    /**
     * 设置图片缓存大小为程序最大可用内存的1/8  
     * @return
     */
    private int getCacheSize(){
    	int maxMemory = (int) Runtime.getRuntime().maxMemory();  
        return maxMemory / 8; 
    }
  
    /** 
     * 将一张图片存储到LruCache中
     * @param key LruCache的键，这里传入图片的URL地址。 
     * @param bitmap LruCache的键，这里传入从网络上下载的Bitmap对象。 
     */  
    public void addBitmapToMemoryCache(String key, Bitmap bitmap) {  
        if (getBitmapFromMemoryCache(key) == null) {  
            mMemoryCache.put(key, bitmap);  
        }  
    }  
  
    /** 
     * 从LruCache中获取一张图片，如果不存在就返回null。
     * @param key LruCache的键，这里传入图片的URL地址。 
     * @return 对应传入键的Bitmap对象，或者null。 
     */  
    public Bitmap getBitmapFromMemoryCache(String key) {  
        return mMemoryCache.get(key);  
    }  
  
    public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth) {  
        // 源图片的宽度  
        final int width = options.outWidth;  
        int inSampleSize = 1;  
        if (width > reqWidth) {  
            // 计算出实际宽度和目标宽度的比率  
            final int widthRatio = Math.round((float) width / (float) reqWidth);  
            inSampleSize = widthRatio;  
        }  
        return inSampleSize;  
    }  
  
    public static Bitmap decodeSampledBitmapFromResource(String pathName,  
            int reqWidth) {  
        // 第一次解析将inJustDecodeBounds设置为true，来获取图片大小  
        final BitmapFactory.Options options = new BitmapFactory.Options();  
        options.inJustDecodeBounds = true;  
        BitmapFactory.decodeFile(pathName, options);  
        // 调用上面定义的方法计算inSampleSize值  
        options.inSampleSize = calculateInSampleSize(options, reqWidth);  
        // 使用获取到的inSampleSize值再次解析图片  
        options.inJustDecodeBounds = false;  
        return BitmapFactory.decodeFile(pathName, options);  
    }
}
